package arboles;

public class ArbolBinarioOrdenado {
    class Nodo
    {
        int info;
        Nodo izq, der;
    }
    Nodo raiz;
    int cant;
    int altura;
    int st=0,prome;

    public ArbolBinarioOrdenado() {
        raiz=null;
    }
            
    public void insertar (int info) {
        if (!existe(info)) {
            Nodo nuevo;
            nuevo = new Nodo ();
            nuevo.info = info;
            nuevo.izq = null;
              nuevo.der = null;
            if (raiz == null)
                raiz = nuevo;
            else {
                Nodo anterior = null, reco;
                reco = raiz;
                while (reco != null)  {
                    anterior = reco;
                    if (info < reco.info)
                        reco = reco.izq;
                    else
                        reco = reco.der;
                }
                if (info < anterior.info)
                    anterior.izq = nuevo;
                else
                    anterior.der = nuevo;
            }
        }    
    }

    public boolean existe(int info) {
        Nodo reco=raiz;
        while (reco!=null) {
            if (info==reco.info)
                return true;
            else
                if (info>reco.info)
                    reco=reco.der;
                else
                    reco=reco.izq;
        }
        return false;
    }




    
    private void cantidad(Nodo reco) {
        if (reco!=null) {
            cant++;
            cantidad(reco.izq);
            cantidad(reco.der);
        }
    }
    
    public int cantidad() {
        cant=0;
        cantidad(raiz);
        return cant;
    }



    private void imprimirEntreConNivel (Nodo reco,int nivel)  {
        if (reco != null) {    
            imprimirEntreConNivel (reco.izq,nivel+1);
            
            //System.out.print(reco.info + " ("+nivel+") - ");
            st=st+reco.info; 

            imprimirEntreConNivel (reco.der,nivel+1);
        }
    }

    public void imprimirEntreConNivel () {
        imprimirEntreConNivel (raiz,1);
        System.out.println();

    }
    

    
    public void mayorValorl() {
        if (raiz!=null) {
            Nodo reco=raiz;
            while (reco.der!=null)
                reco=reco.der;
            System.out.println("Mayor valor del árbol:"+reco.info);
        }
    }
    public void promedio(){
prome=st / cantidad() ;

System.out.println ("el promedio es"+prome);

    }
    

    
    public static void main (String [] ar)
    {
        ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado ();
        abo.insertar (100);
        abo.insertar (50);
        abo.insertar (25);
        abo.insertar (75);
        abo.insertar (150);
  
        System.out.println ("Cantidad de nodos del árbol:"+abo.cantidad());
        abo.imprimirEntreConNivel();
      
        abo.mayorValorl();
        abo.promedio();

      
    }      
}